home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Future Workshop
/
Future Workshop.iso
/
utility
/
flute
/
sampdll.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-04-04
|
4KB
|
112 lines
/****************************************************************************
File: SampDll.c
Contains a simple example DLL to illustrate how DLLs are called from
the CeSk programming lanaguage
*******************************************************************************/
#include "windows.h"
#include "windacts.h"
#include "sampdll.h"
long GetVarSize( union varObj FAR *);
void process1array(double FAR *,union varObj FAR *);
/* Main entry point for the library - all libraries have this entry point */
/* Input: See Programmers Reference manual for details */
int FAR PASCAL LibMain(hModule, wDataSeg, cbHeapSize, lpszCmdLine)
HANDLE hModule;
WORD wDataSeg;
WORD cbHeapSize;
LPSTR lpszCmdLine;
{
return 1;
}
/* Main exit routine for a DLL, tidies up any resources etc from DLL */
/* See Programmers reference manual for details and parameters */
int FAR PASCAL WEP (bSystemExit)
int bSystemExit;
{
return(1);
}
/**************************** Our DLL Code *******************************/
/* our example function for the DLL call, this function has been exported */
/* in the SAMPDLL.DEF file */
/* Input: hData - a handle to a global memory object containing a CeSk data */
/* array */
/* Output: a HGLOBAL containing a CeSk double*/
/* This example adds up all the positive numbers to give a total and */
/* ignores any negative numbers, or non-numeric objects in the input array */
HGLOBAL FAR PASCAL sumofpos(hData)
HGLOBAL hData;
{
DataObj FAR *op1;
double total;
HGLOBAL result;
total=0e0;
if (hData) {
op1=PtrContent(hData);
process1array(&total,op1);
GlobalUnlock(hData);
};
/* now package the result as a CeSk double */
result=GlobalAlloc(GHND,sizeof(struct t_double));
if (!result) return NULL;
op1=(union varObj FAR *)GlobalLock(result);
op1->tdouble.vtype=3; /* type double */
op1->tdouble.value=total;
GlobalUnlock(result);
return result;
};
/****************** subsidiary routines used by this DLL *****************/
/* process one CeSk item in the array, this is a reentrant routine */
/* which processes an element, or an array of elements, adding the */
/* positive numbers together and ignoring the rest */
/* Input: ptotal - ptr to the current total */
/* op1 - ptr to the item to process */
/* Output: adjusts the value pointed to by ptotal */
void process1array(ptotal,op1)
double FAR *ptotal;
union varObj FAR *op1;
{
short elements,i;
double val;
if (op1->tint.vtype==11) {
/* process an array */
elements=op1->tarray.elements;
op1=(union varObj FAR *)(op1->tarray.value);
for (i=0; i<elements; i++) {
process1array(ptotal,op1);
op1=(union varObj FAR *)(((char FAR *)(op1))+GetVarSize(op1));
};
} else {
/* process a single element */
switch (op1->tint.vtype) {
case 2: /* CeSk Float */
val=(double)(op1->tfloat.value);
break;
case 3: /* CeSk double */
val=op1->tdouble.value;
break;
case 1: /* CeSk integer */
val=(double)(op1->tint.value);
break;
case 9: /* CeSk Complex Number */
val=op1->tcomplex.realpart;
break;
default:
val=0e0;
break;
};
if (val>0e0) *ptotal+=val;
};
};